import Module from "./module";
import {forEachValue} from "../utils";

// 格式化options
export default class ModuleCollection {
  constructor(rootModule) {
    this.root = null;
    this.register(rootModule);
  }
  // raw => 原始
  register(rawModule, path = []) {
    const newModule = new Module(rawModule);
    if (path.length === 0) { // 根模块
      this.root = newModule;
    } else {
      const parent = path.slice(0, -1).reduce((prevModule, currPath) => {
        return prevModule.getChild(currPath);
      }, this.root);
      parent.addChild(newModule, path[path.length - 1]);
    }
    if (rawModule.modules) {
      forEachValue(rawModule.modules, (rawChildModule, key) => {
        this.register(rawChildModule, path.concat(key));
      });
    }
    // console.log(this.root);
    return newModule;
  }
  getNamespace(path) {
    let module = this.root;
    return path.reduce((namespaceStr, key) => {
      module = module.getChild(key);
      return namespaceStr + (module.namespaced ? key + '/' : '');
    }, '');
  }
}
